Dataset Details

The data used in this project is sourced from the American Community Survey 2019 5-Year Public Use Microdata Sample (PUMS) collected by the United States Census Bureau <data.census.gov>. The dataset contains a plethora of variables, but I narrowed my investigation to a handful of socioeconomic attributes concerning first-generation Americans. A first-generation American is a foreign born person who has moved to the United States of America seeking permanent residency, regardless of citizenship status with the U.S.

The data from the Census Bureau came in the form of many separate csv files, one for each variable, requiring a lot of data wrangling. A summary dataframe that merges all relevant variables for all 143 origin countries is shown below.


Objectives

I recently read a book on demographics by Peter Zeihan, “The End of the World is Just the Beginning: Mapping the Collapse of Civilization”, a rather optimistic title. In his book Zeihan highlights the very problematic demographics of the majority of developed nations, which he believes will inevitably lead to a sever population collapse over the next half century. America is one of few first world countries with optimistic demographics, in no small part to high levels of immigration. This is what sparked my interest in exploring U.S. first-generation immigration data.

I wanted to understand who was migrating to the U.S., were they assimilating, gaining citizenship, starting families, finding work, etc. in hopes of better understand a fundamental part of the United State’s demographic future. My exploration focused on:

  1. Demographics: Who is immigrating to the United States?
  2. Citizenship: Are they gaining citizenship?
  3. Family: Are they finding partners and starting families?
  4. Education: Are they bettering themselves through education?
  5. Income: How much money are they making?


Demographics

Who is immigrating to the United States of America?

by Country

by Sub Region

Findings

  • The total population of the United States is 332 million.

  • Around 41,687,472 million people have migrated to the United States over the last century, accounting for 13% of the U.S. population.

  • An estimated 10,723,968 million of the U.S. immigrant population is from Mexico. Mexico alone accounts for 33% of all immigration into the United States.

  • Because there are so many different nationalities that make up America’s immigrant population, I will be analyzing the data primarily in two subsets:

    1. The top 25 first-generation populations, which together account for 86% of all immigration.
    2. The 7 global sub regions of African, Asia, Europe, Latin America, Middle East, North America, and Oceania.


Citizenship

At what rate are different immigrant groups becoming citizens?

Mexico

The below graph shows the ratio of US Citizens to Non-citizens by entry decade into the United States. For instance, for Mexicans who migrated to the United States in the 1950s, currently 19% are not U.S. citizens, while 81% have gained citizenship. This changes drastically as we move to the right. Conversely, Mexicans who migrated to the United States in the 2000s, 84% are not U.S. citizens, while currently 16% have gained citizenship. We expect immigrants to gain citizenship over time; therefore, assume that the percent of non-citizens for a given immigrant population should decrease as time spent in the U.S. increases.

by Country

The line graph below is a linear representation of the trend observed in the Meixco Bar Chart for the top 25 first-generation populations in the United States.

The significant trend is that the slope of each line positively correlates to its countries rate of citizenship.

by Region

Findings

  • Highlight: Mexico, China, India, Columbia, and El Salvador.

  • China and Mexico are the two largest immigrant populations in the United States and show dissimilar citizenship rates.

  • Chinese immigrants are one of the quickest to gain citizenship, while Mexican’s are some of the slowest.

  • India’s citizenship rate mirrors China’s, while El Salvador is very similar to Mexico’s. There is a regional trend, with Latin American countries gaining citizenship a lot slower than the other regions, particularly Asia.

  • Columbia is an outlier to this trend, showing a citizenship rate closer to China and India. One of the only Latin American countries with such a high citizenship rate.


Family

Are first-generation Americans finding partners and having kids?

by Country

by Region

Marriage vs. Children

Is the

Findings

  • Percent of population partnered (married or living with partner) seems consistent across most countries ranging from 32% to 38%.

    • Nations that practice forms of arranged marriage, India, China, Korea, and Japan are all on the upper end of that range.

    • Island nations of Dominican Republic, Haiti, Jamaica, and Puerto Rico have the four lowest percent of population married.

  • European countries cluster around the low end of average number of children per person, with the United Kingdom at 0.6 children per person. Latin American countries cluster around the high end, with Guatemala more than doubling the United Kingdom with 1.4 children per person.

  • There does not seem to be a strong correlation between marriage and average number of children.


Education

How educated are first-generation Americans?

by Country

by Region

Findings

  • India has the most educated first-generation population, with 74% of the people having at least a college degree, and a massive 40% having either a masters or doctorate. Iran and Russia are the next closest with 60% of their populations having at least a college degree.

  • The central American counties of Guatemala, Honduras, El Salvador, and Mexico all have around 50% of their first-generation populations without a high school degree. This is significant because 50% of all U.S. immigration originates from Latin America.

  • The trend holds true when looking at the different sub regions; however, the difference between first and last is less severe. Asia has the most educated first-generation cohort, while Latin America has the least educated.


Income

How does income differ between different first-generation populations?

by Region

Findings

  • European immigrants boast the highest average income, but also the largest IQR among all regions. Luxembourg at the head, and Albania at the tail.

  • The Middle East region had the country with the highest average income, Kuwait at $82,723. The Middle East also had the lowest average income with Yemen at $7,773. Note: Kuwait was an extreme outlier and was the only country removed for graphing purposes.

  • Latin America showed the lowest income gaps between countries, but also average incomes that clustered around the lowest median of $21,190.

  • Nigeria had one of the highest average incomes. I know very little about Nigeria and in future analysis I would like to look more into the cause of the income gap between Nigeria and the other African nations.

Average Income Distribution

Below is the Distribution of the Average Income attribute. The average incomes were gathered for each first-generation population in the United States. The distribution skews slightly left, but is overall pretty normal for an income distribution. The mean and standard deviation can be seen in the table below.

Sample Size Mean Standard Deviation
Population $28,316 10,184

Central Limit Theorem

Below are histograms showing the densities of the various sample means of 1000 random samples of sample sizes 10, 20, 30, and 40. The means and standard deviations can be seen in the table below.

Sample Size Mean Standard Deviation
Population $28,316 10,184
10 $28,377 3,140
20 $28,270 2,123
30 $28,333 1,632
40 $28,293 1,340

Findings

  • The four histograms confirm that the Average Income attribute abides by the Central Limit Theorem.

  • All four of the sample mean histograms are normal distributions with a mean of ~$28,000. This matches the mean income of the population.

  • As expected, the standard deviations of the density histograms decrease as sample size increases. This is seen visually, as the graphs get progressively narrower and taller from sample size 10 to sample size 40. Each distribution is normally centered around the same mean.

Sampling of Average Income

Three sampling methods were used to analyze the behavior of sampling the first-generation dataset.

  1. Sample Random Sampling without Replacement
  2. Systemic Sampling with Unequal Probabilities
    • Unequal probabilities were determined using the population of the immigrant country
  3. Stratified Sampling
    • Strata determined by the country count for each of 7 global sub regions (African, Asia, Europe, Latin America, Middle East, North America, and Oceania).

Sample Method Mean Standard Deviation
Population $28,316 10,184
SRSWOR $28,106 9,934
Unequal Systematic $25,199 8,759
Stratified $26,318 8,155

Findings

  • SRSWOR: as expected, observed both a mean and standard deviation extremely close to that of the population.

  • Unequal Systematic and Stratified: both observed a mean and standard deviation less than that of the population.

  • The ~10% decrease in mean average income and ~15% decrease in standard deviation observed when sampling using unequal systematic and stratified methods can be explained by looking at the Latin American subset of the first-generation population.

    • If we look at the pie chart in the Immigration section, we can see that the Latin America cohort is responsible for 50% of all immigration into the United States.

    • If we look at the box plot in the Income section we can see that the Latin America region has the lowest average income and lowest variance among all 7 regions.

    • When we sample using unequal systematic and stratified methods we are more likely to draw countries from the Latin America strata because of the regions large population and because the Latin America region has the most first-generation countries. The Latin American region has the lowest average income and least variance, which results in a relative decrease in both the mean income and standard deviation compared to the population.

  • I think that the unequal systematic sample method is the most accurate representation of the first-generation population’s average income because it adds a country population dimension to average income that the other four methods do not. In other words, when using systematic sampling with unequal probabilities, countries with larger immigrant populations contribute more to the calculated average income. This results in a mean income value that is more representative of the immigrant population.

    • To use an analogy, the population mean income is to the Senate, as the unequal systematic sampling mean income is to the House of Representatives.


Attribute Correlation

The correlation matrix below shows a lot of correlation between the different attributes explored above. The tabbed plots display these different relationships.

Correlation Matrix

Children vs. Average Earnings

Strong Negative Correlation

Education vs. Average Earnings

Strong Positive Correlation

Citizenship vs. Average Earnings

No Correlation

Education vs. Citizenship

Moderate Positive Correlation


# {.unnumbered}

Future Investigation

References

https://data.census.gov/mdat/#/

LS0tCnRpdGxlOiAiQW4gRXhwbG9yYXRpb24gb2YgRmlyc3QtR2VuZXJhdGlvbiBBbWVyaWNhbnMiCnN1YnRpdGxlOiAiQ1M1NDQgRmluYWwgUHJvamVjdCAoUHJvZi4gS2FsYXRodXIsIEZhbGwgMjAyMikiCmF1dGhvcjogIkNvZHkgVGhheWVyICB8IE9jdG9iZXIgMTksIDIwMjIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKPGJyPgoKIyBEYXRhc2V0IERldGFpbHMKClRoZSBkYXRhIHVzZWQgaW4gdGhpcyBwcm9qZWN0IGlzIHNvdXJjZWQgZnJvbSB0aGUgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDE5IDUtWWVhciBQdWJsaWMgVXNlIE1pY3JvZGF0YSBTYW1wbGUgKFBVTVMpIGNvbGxlY3RlZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF1IFw8ZGF0YS5jZW5zdXMuZ292XD4uIFRoZSBkYXRhc2V0IGNvbnRhaW5zIGEgcGxldGhvcmEgb2YgdmFyaWFibGVzLCBidXQgSSBuYXJyb3dlZCBteSBpbnZlc3RpZ2F0aW9uIHRvIGEgaGFuZGZ1bCBvZiBzb2Npb2Vjb25vbWljIGF0dHJpYnV0ZXMgY29uY2VybmluZyBmaXJzdC1nZW5lcmF0aW9uIEFtZXJpY2Fucy4gKipBIGZpcnN0LWdlbmVyYXRpb24gQW1lcmljYW4gaXMgYSBmb3JlaWduIGJvcm4gcGVyc29uIHdobyBoYXMgbW92ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBzZWVraW5nIHBlcm1hbmVudCByZXNpZGVuY3ksIHJlZ2FyZGxlc3Mgb2YgY2l0aXplbnNoaXAgc3RhdHVzIHdpdGggdGhlIFUuUy4qKgoKLSAgIFRoZXJlZm9yZSwgaW4gdGhlIGJlbG93IGdyYXBocyB3aGVuIHdlIHNlZSBhIGNvdW50cnksIGZvciBleGFtcGxlLCAqTWV4aWNvKiwgd2UgYXJlIHJlZmVycmluZyB0byBhIHBvcHVsYXRpb24gb2YgZmlyc3QtZ2VuZXJhdGlvbiBBbWVyaWNhbnMsIHdobyB3ZXJlIGJvcm4gaW4gTWV4aWNvLCBhbmQgbWlncmF0ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMuIE5vdCB0aGUgcG9wdWxhdGlvbiBvZiAqTWV4aWNvKi4KCi0gICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50cnkgcmVmZXJzIHRvIHRoZSBvcmlnaW4gY291bnRyeSBvZiB0aGUgcG9wdWxhdGlvbi4KClRoZSBkYXRhIGZyb20gdGhlIENlbnN1cyBCdXJlYXUgY2FtZSBpbiB0aGUgZm9ybSBvZiBtYW55IHNlcGFyYXRlIGNzdiBmaWxlcywgb25lIGZvciBlYWNoIHZhcmlhYmxlLCByZXF1aXJpbmcgYSBsb3Qgb2YgZGF0YSB3cmFuZ2xpbmcuIEEgc3VtbWFyeSBkYXRhZnJhbWUgdGhhdCBtZXJnZXMgYWxsIHJlbGV2YW50IHZhcmlhYmxlcyBmb3IgYWxsIDE0MyBvcmlnaW4gY291bnRyaWVzIGlzIHNob3duIGJlbG93LgoKYGBge3J9CnByaW50KGFsbF9kZikKYGBgCgo8YnI+CgojIE9iamVjdGl2ZXMKCkkgcmVjZW50bHkgcmVhZCBhIGJvb2sgb24gZGVtb2dyYXBoaWNzIGJ5IFBldGVyIFplaWhhbiwgKioiVGhlIEVuZCBvZiB0aGUgV29ybGQgaXMgSnVzdCB0aGUgQmVnaW5uaW5nOiBNYXBwaW5nIHRoZSBDb2xsYXBzZSBvZiBDaXZpbGl6YXRpb24iLCoqIGEgcmF0aGVyIG9wdGltaXN0aWMgdGl0bGUuIEluIGhpcyBib29rIFplaWhhbiBoaWdobGlnaHRzIHRoZSB2ZXJ5IHByb2JsZW1hdGljIGRlbW9ncmFwaGljcyBvZiB0aGUgbWFqb3JpdHkgb2YgZGV2ZWxvcGVkIG5hdGlvbnMsIHdoaWNoIGhlIGJlbGlldmVzIHdpbGwgaW5ldml0YWJseSBsZWFkIHRvIGEgc2V2ZXIgcG9wdWxhdGlvbiBjb2xsYXBzZSBvdmVyIHRoZSBuZXh0IGhhbGYgY2VudHVyeS4gQW1lcmljYSBpcyBvbmUgb2YgZmV3IGZpcnN0IHdvcmxkIGNvdW50cmllcyB3aXRoIG9wdGltaXN0aWMgZGVtb2dyYXBoaWNzLCBpbiBubyBzbWFsbCBwYXJ0IHRvIGhpZ2ggbGV2ZWxzIG9mIGltbWlncmF0aW9uLiBUaGlzIGlzIHdoYXQgc3BhcmtlZCBteSBpbnRlcmVzdCBpbiBleHBsb3JpbmcgVS5TLiBmaXJzdC1nZW5lcmF0aW9uIGltbWlncmF0aW9uIGRhdGEuCgpJIHdhbnRlZCB0byB1bmRlcnN0YW5kIHdobyB3YXMgbWlncmF0aW5nIHRvIHRoZSBVLlMuLCB3ZXJlIHRoZXkgYXNzaW1pbGF0aW5nLCBnYWluaW5nIGNpdGl6ZW5zaGlwLCBzdGFydGluZyBmYW1pbGllcywgZmluZGluZyB3b3JrLCBldGMuIGluIGhvcGVzIG9mIGJldHRlciB1bmRlcnN0YW5kIGEgZnVuZGFtZW50YWwgcGFydCBvZiB0aGUgVW5pdGVkIFN0YXRlJ3MgZGVtb2dyYXBoaWMgZnV0dXJlLiBNeSBleHBsb3JhdGlvbiBmb2N1c2VkIG9uOgoKMS4gICoqRGVtb2dyYXBoaWNzOioqIFdobyBpcyBpbW1pZ3JhdGluZyB0byB0aGUgVW5pdGVkIFN0YXRlcz8KMi4gICoqQ2l0aXplbnNoaXA6KiogQXJlIHRoZXkgZ2FpbmluZyBjaXRpemVuc2hpcD8KMy4gICoqRmFtaWx5OioqIEFyZSB0aGV5IGZpbmRpbmcgcGFydG5lcnMgYW5kIHN0YXJ0aW5nIGZhbWlsaWVzPwo0LiAgKipFZHVjYXRpb246KiogQXJlIHRoZXkgYmV0dGVyaW5nIHRoZW1zZWx2ZXMgdGhyb3VnaCBlZHVjYXRpb24/CjUuICAqKkluY29tZToqKiBIb3cgbXVjaCBtb25leSBhcmUgdGhleSBtYWtpbmc/Cgo8YnI+CgojIERlbW9ncmFwaGljcyB7LnRhYnNldH0KCiMjIyAqKipXaG8gaXMgaW1taWdyYXRpbmcgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYT8qKioKCiMjIGJ5IENvdW50cnkKCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGNfY291bnRyeQpgYGAKCiMjIGJ5IFN1YiBSZWdpb24KCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGNfcmVnaW9uCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGlzICoqMzMyIG1pbGxpb24qKi4KCi0gICBBcm91bmQgKio0MSw2ODcsNDcyKiogbWlsbGlvbiBwZW9wbGUgaGF2ZSBtaWdyYXRlZCB0byB0aGUgVW5pdGVkIFN0YXRlcyBvdmVyIHRoZSBsYXN0IGNlbnR1cnksIGFjY291bnRpbmcgZm9yIDEzJSBvZiB0aGUgVS5TLiBwb3B1bGF0aW9uLgoKLSAgIEFuIGVzdGltYXRlZCAxMCw3MjMsOTY4IG1pbGxpb24gb2YgdGhlIFUuUy4gaW1taWdyYW50IHBvcHVsYXRpb24gaXMgZnJvbSBNZXhpY28uICoqTWV4aWNvIGFsb25lIGFjY291bnRzIGZvciAzMyUgb2YgYWxsIGltbWlncmF0aW9uIGludG8gdGhlIFVuaXRlZCBTdGF0ZXMuKioKCi0gICBCZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IGRpZmZlcmVudCBuYXRpb25hbGl0aWVzIHRoYXQgbWFrZSB1cCBBbWVyaWNhJ3MgaW1taWdyYW50IHBvcHVsYXRpb24sIEkgd2lsbCBiZSBhbmFseXppbmcgdGhlIGRhdGEgcHJpbWFyaWx5IGluIHR3byBzdWJzZXRzOgoKICAgIDEuICBUaGUgKip0b3AgMjUgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucyoqLCB3aGljaCB0b2dldGhlciBhY2NvdW50IGZvciA4NiUgb2YgYWxsIGltbWlncmF0aW9uLgogICAgMi4gIFRoZSAqKjcgZ2xvYmFsIHN1YiByZWdpb25zKiogb2YgQWZyaWNhbiwgQXNpYSwgRXVyb3BlLCBMYXRpbiBBbWVyaWNhLCBNaWRkbGUgRWFzdCzCoE5vcnRoIEFtZXJpY2EsIGFuZCBPY2VhbmlhLgoKPGJyPgoKIyBDaXRpemVuc2hpcCB7LnRhYnNldH0KCiMjIyAqKipBdCB3aGF0IHJhdGUgYXJlIGRpZmZlcmVudCBpbW1pZ3JhbnQgZ3JvdXBzIGJlY29taW5nIGNpdGl6ZW5zPyoqKgoKIyMgTWV4aWNvCgpUaGUgYmVsb3cgZ3JhcGggc2hvd3MgdGhlIHJhdGlvIG9mIFVTIENpdGl6ZW5zIHRvIE5vbi1jaXRpemVucyBieSBlbnRyeSBkZWNhZGUgaW50byB0aGUgVW5pdGVkIFN0YXRlcy4gRm9yIGluc3RhbmNlLCBmb3IgTWV4aWNhbnMgd2hvIG1pZ3JhdGVkIHRvIHRoZSBVbml0ZWQgU3RhdGVzIGluIHRoZSAxOTUwcywgY3VycmVudGx5IDE5JSBhcmUgbm90IFUuUy4gY2l0aXplbnMsIHdoaWxlIDgxJSBoYXZlIGdhaW5lZCBjaXRpemVuc2hpcC4gVGhpcyBjaGFuZ2VzIGRyYXN0aWNhbGx5IGFzIHdlIG1vdmUgdG8gdGhlIHJpZ2h0LiBDb252ZXJzZWx5LCBNZXhpY2FucyB3aG8gbWlncmF0ZWQgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgaW4gdGhlIDIwMDBzLCA4NCUgYXJlIG5vdCBVLlMuIGNpdGl6ZW5zLCB3aGlsZSBjdXJyZW50bHkgMTYlIGhhdmUgZ2FpbmVkIGNpdGl6ZW5zaGlwLiBXZSBleHBlY3QgaW1taWdyYW50cyB0byBnYWluIGNpdGl6ZW5zaGlwIG92ZXIgdGltZTsgdGhlcmVmb3JlLCBhc3N1bWUgdGhhdCB0aGUgcGVyY2VudCBvZiBub24tY2l0aXplbnMgZm9yIGEgZ2l2ZW4gaW1taWdyYW50IHBvcHVsYXRpb24gc2hvdWxkIGRlY3JlYXNlIGFzIHRpbWUgc3BlbnQgaW4gdGhlIFUuUy4gaW5jcmVhc2VzLgoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aD1UUlVFfQptZXhfY2l0aXplbgoKYGBgCgojIyBieSBDb3VudHJ5CgpUaGUgbGluZSBncmFwaCBiZWxvdyBpcyBhIGxpbmVhciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlbmQgb2JzZXJ2ZWQgaW4gdGhlICpNZWl4Y28gQmFyIENoYXJ0KiBmb3IgdGhlIHRvcCAyNSBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzLgoKVGhlIHNpZ25pZmljYW50IHRyZW5kIGlzIHRoYXQgdGhlICoqc2xvcGUgb2YgZWFjaCBsaW5lIHBvc2l0aXZlbHkgY29ycmVsYXRlcyB0byBpdHMgY291bnRyaWVzIHJhdGUgb2YgY2l0aXplbnNoaXAqKi4KCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQoKZ2dwbG90bHkobGluZXBsb3QpCmBgYAoKIyMgYnkgUmVnaW9uCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KY2l0aXplbnNoaXBfYnlfcmVnaW9uCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgICoqSGlnaGxpZ2h0OioqIE1leGljbywgQ2hpbmEsIEluZGlhLCBDb2x1bWJpYSwgYW5kIEVsIFNhbHZhZG9yLgoKLSAgIENoaW5hIGFuZCBNZXhpY28gYXJlIHRoZSB0d28gbGFyZ2VzdCBpbW1pZ3JhbnQgcG9wdWxhdGlvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIHNob3cgZGlzc2ltaWxhciBjaXRpemVuc2hpcCByYXRlcy4KCi0gICAqKkNoaW5lc2UgaW1taWdyYW50cyBhcmUgb25lIG9mIHRoZSBxdWlja2VzdCB0byBnYWluIGNpdGl6ZW5zaGlwLCB3aGlsZSBNZXhpY2FuJ3MgYXJlIHNvbWUgb2YgdGhlIHNsb3dlc3QuKioKCi0gICBJbmRpYSdzIGNpdGl6ZW5zaGlwIHJhdGUgbWlycm9ycyBDaGluYSdzLCB3aGlsZSBFbCBTYWx2YWRvciBpcyB2ZXJ5IHNpbWlsYXIgdG8gTWV4aWNvJ3MuIFRoZXJlIGlzIGEgcmVnaW9uYWwgdHJlbmQsIHdpdGggTGF0aW4gQW1lcmljYW4gY291bnRyaWVzIGdhaW5pbmcgY2l0aXplbnNoaXAgYSBsb3Qgc2xvd2VyIHRoYW4gdGhlIG90aGVyIHJlZ2lvbnMsIHBhcnRpY3VsYXJseSBBc2lhLgoKLSAgICoqQ29sdW1iaWEgaXMgYW4gb3V0bGllciB0byB0aGlzIHRyZW5kKiosIHNob3dpbmcgYSBjaXRpemVuc2hpcCByYXRlIGNsb3NlciB0byBDaGluYSBhbmQgSW5kaWEuIE9uZSBvZiB0aGUgb25seSBMYXRpbiBBbWVyaWNhbiBjb3VudHJpZXMgd2l0aCBzdWNoIGEgaGlnaCBjaXRpemVuc2hpcCByYXRlLgoKPGJyPgoKIyBGYW1pbHkgey50YWJzZXR9CgojIyMgKioqQXJlIGZpcnN0LWdlbmVyYXRpb24gQW1lcmljYW5zIGZpbmRpbmcgcGFydG5lcnMgYW5kIGhhdmluZyBraWRzPyoqKgoKIyMgYnkgQ291bnRyeQoKYGBge3IgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTgsIGZpZy5mdWxsd2lkdGg9VFJVRX0KcGxvdF9ncmlkKGF2ZV9raWRzX3Bsb3QsIHBhcnRuZXJlZF9wbG90LCBheGlzPSJsIikKYGBgCgojIyBieSBSZWdpb24KCmBgYHtyfQojIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTJ9CnBsb3RfZ3JpZChhdmVfa2lkc19yZWdfcGxvdCwgcGFydG5lcmVkX3JlZ19wbG90LCBheGlzPSJsIikKYGBgCgojIyBNYXJyaWFnZSB2cy4gQ2hpbGRyZW4KCklzIHRoZQoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NSwgZmlnLmZ1bGx3aWR0aD1UUlVFfQptYXJyaWFnZV9raWRzCmBgYAoKIyAgey51bm51bWJlcmVkfQoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFBlcmNlbnQgb2YgcG9wdWxhdGlvbiBwYXJ0bmVyZWQgKG1hcnJpZWQgb3IgbGl2aW5nIHdpdGggcGFydG5lcikgc2VlbXMgY29uc2lzdGVudCBhY3Jvc3MgbW9zdCBjb3VudHJpZXMgKipyYW5naW5nIGZyb20gMzIlIHRvIDM4JSoqLgoKICAgIC0gICBOYXRpb25zIHRoYXQgcHJhY3RpY2UgZm9ybXMgb2YgYXJyYW5nZWQgbWFycmlhZ2UsIEluZGlhLCBDaGluYSwgS29yZWEsIGFuZCBKYXBhbiBhcmUgYWxsIG9uIHRoZSB1cHBlciBlbmQgb2YgdGhhdCByYW5nZS4KCiAgICAtICAgSXNsYW5kIG5hdGlvbnMgb2YgRG9taW5pY2FuIFJlcHVibGljLCBIYWl0aSwgSmFtYWljYSwgYW5kIFB1ZXJ0byBSaWNvIGhhdmUgdGhlIGZvdXIgbG93ZXN0IHBlcmNlbnQgb2YgcG9wdWxhdGlvbiBtYXJyaWVkLgoKLSAgIEV1cm9wZWFuIGNvdW50cmllcyBjbHVzdGVyIGFyb3VuZCB0aGUgbG93IGVuZCBvZiBhdmVyYWdlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgcGVyc29uLCB3aXRoIHRoZSBVbml0ZWQgS2luZ2RvbSBhdCAwLjYgY2hpbGRyZW4gcGVyIHBlcnNvbi4gTGF0aW4gQW1lcmljYW4gY291bnRyaWVzIGNsdXN0ZXIgYXJvdW5kIHRoZSBoaWdoIGVuZCwgd2l0aCAqKkd1YXRlbWFsYSBtb3JlIHRoYW4gZG91YmxpbmcgdGhlIFVuaXRlZCBLaW5nZG9tIHdpdGggMS40IGNoaWxkcmVuIHBlciBwZXJzb24qKi4KCi0gICBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgc3Ryb25nIGNvcnJlbGF0aW9uIGJldHdlZW4gbWFycmlhZ2UgYW5kIGF2ZXJhZ2UgbnVtYmVyIG9mIGNoaWxkcmVuLgoKPGJyPgoKIyBFZHVjYXRpb24gey50YWJzZXR9CgojIyMgKioqSG93IGVkdWNhdGVkIGFyZSBmaXJzdC1nZW5lcmF0aW9uIEFtZXJpY2Fucz8qKioKCiMjIGJ5IENvdW50cnkKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmVkdV8yNV9wbG90CmBgYAoKIyMgYnkgUmVnaW9uCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmVkdV9yZWdpb25fcGxvdApgYGAKCiMgIHsudW5udW1iZXJlZH0KCiMjIyAqKkZpbmRpbmdzKioKCi0gICAqKkluZGlhIGhhcyB0aGUgbW9zdCBlZHVjYXRlZCBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24qKiwgd2l0aCA3NCUgb2YgdGhlIHBlb3BsZSBoYXZpbmcgYXQgbGVhc3QgYSBjb2xsZWdlIGRlZ3JlZSwgYW5kIGEgbWFzc2l2ZSAqKjQwJSBoYXZpbmcgZWl0aGVyIGEgbWFzdGVycyBvciBkb2N0b3JhdGUqKi4gSXJhbiBhbmQgUnVzc2lhIGFyZSB0aGUgbmV4dCBjbG9zZXN0IHdpdGggNjAlIG9mIHRoZWlyIHBvcHVsYXRpb25zIGhhdmluZyBhdCBsZWFzdCBhIGNvbGxlZ2UgZGVncmVlLgoKLSAgIFRoZSBjZW50cmFsIEFtZXJpY2FuIGNvdW50aWVzIG9mIEd1YXRlbWFsYSwgSG9uZHVyYXMsIEVsIFNhbHZhZG9yLCBhbmQgTWV4aWNvIGFsbCBoYXZlIGFyb3VuZCA1MCUgb2YgdGhlaXIgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucyB3aXRob3V0IGEgaGlnaCBzY2hvb2wgZGVncmVlLiBUaGlzIGlzIHNpZ25pZmljYW50IGJlY2F1c2UgNTAlIG9mIGFsbCBVLlMuIGltbWlncmF0aW9uIG9yaWdpbmF0ZXMgZnJvbSBMYXRpbiBBbWVyaWNhLgoKLSAgIFRoZSB0cmVuZCBob2xkcyB0cnVlIHdoZW4gbG9va2luZyBhdCB0aGUgZGlmZmVyZW50IHN1YiByZWdpb25zOyBob3dldmVyLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IGlzIGxlc3Mgc2V2ZXJlLiBBc2lhIGhhcyB0aGUgbW9zdCBlZHVjYXRlZCBmaXJzdC1nZW5lcmF0aW9uIGNvaG9ydCwgd2hpbGUgTGF0aW4gQW1lcmljYSBoYXMgdGhlIGxlYXN0IGVkdWNhdGVkLgoKPGJyPgoKIyBJbmNvbWUgey50YWJzZXR9CgojIyMgKkhvdyBkb2VzIGluY29tZSBkaWZmZXIgYmV0d2VlbiBkaWZmZXJlbnQgZmlyc3QtZ2VuZXJhdGlvbiBwb3B1bGF0aW9ucz8qCgojIyBieSBSZWdpb24KCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KCmdncGxvdGx5KHN1Yl9yZWdpb25fYm94KQpgYGAKCiMjIyAqKkZpbmRpbmdzKioKCi0gICBFdXJvcGVhbiBpbW1pZ3JhbnRzIGJvYXN0IHRoZSBoaWdoZXN0IGF2ZXJhZ2UgaW5jb21lLCBidXQgYWxzbyB0aGUgbGFyZ2VzdCBJUVIgYW1vbmcgYWxsIHJlZ2lvbnMuIEx1eGVtYm91cmcgYXQgdGhlIGhlYWQsIGFuZCBBbGJhbmlhIGF0IHRoZSB0YWlsLgoKLSAgIFRoZSBNaWRkbGUgRWFzdCByZWdpb24gaGFkIHRoZSBjb3VudHJ5IHdpdGggdGhlICoqaGlnaGVzdCBhdmVyYWdlIGluY29tZSwgS3V3YWl0IGF0IFwkODIsNzIzKiouIFRoZSBNaWRkbGUgRWFzdCBhbHNvIGhhZCB0aGUgbCoqb3dlc3QgYXZlcmFnZSBpbmNvbWUgd2l0aCBZZW1lbioqICoqYXQgXCQ3LDc3My4qKiBOb3RlOiBLdXdhaXQgd2FzIGFuIGV4dHJlbWUgb3V0bGllciBhbmQgd2FzIHRoZSBvbmx5IGNvdW50cnkgcmVtb3ZlZCBmb3IgZ3JhcGhpbmcgcHVycG9zZXMuCgotICAgTGF0aW4gQW1lcmljYSBzaG93ZWQgdGhlICoqbG93ZXN0IGluY29tZSBnYXBzKiogYmV0d2VlbiBjb3VudHJpZXMsIGJ1dCBhbHNvIGF2ZXJhZ2UgaW5jb21lcyB0aGF0IGNsdXN0ZXJlZCBhcm91bmQgdGhlICoqbG93ZXN0IG1lZGlhbiBvZiBcJDIxLDE5MC4qKgoKLSAgIE5pZ2VyaWEgaGFkIG9uZSBvZiB0aGUgaGlnaGVzdCBhdmVyYWdlIGluY29tZXMuIEkga25vdyB2ZXJ5IGxpdHRsZSBhYm91dCBOaWdlcmlhIGFuZCBpbiBmdXR1cmUgYW5hbHlzaXMgSSB3b3VsZCBsaWtlIHRvIGxvb2sgbW9yZSBpbnRvIHRoZSBjYXVzZSBvZiB0aGUgaW5jb21lIGdhcCBiZXR3ZWVuIE5pZ2VyaWEgYW5kIHRoZSBvdGhlciBBZnJpY2FuIG5hdGlvbnMuCgojIyBBdmVyYWdlIEluY29tZSBEaXN0cmlidXRpb24KCkJlbG93IGlzIHRoZSAqKkRpc3RyaWJ1dGlvbiBvZiB0aGUgQXZlcmFnZSBJbmNvbWUqKiBhdHRyaWJ1dGUuIFRoZSBhdmVyYWdlIGluY29tZXMgd2VyZSBnYXRoZXJlZCBmb3IgZWFjaCBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoZSBkaXN0cmlidXRpb24gc2tld3Mgc2xpZ2h0bHkgbGVmdCwgYnV0IGlzIG92ZXJhbGwgcHJldHR5IG5vcm1hbCBmb3IgYW4gaW5jb21lIGRpc3RyaWJ1dGlvbi4gVGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBjYW4gYmUgc2VlbiBpbiB0aGUgdGFibGUgYmVsb3cuCgpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CiMgZmlnLmRpbSA9IGMoOCwgNiksIG91dC53aWR0aD0iNSUiLCBvdXQuaGVpZ2h0PSI1MCUiCnBsb3QoYXZlX2Vhcm5pbmdfZGlzdCkKCgpgYGAKCnwgU2FtcGxlIFNpemUgfCAgIE1lYW4gICB8IFN0YW5kYXJkIERldmlhdGlvbiB8Cnw6LS0tLS0tLS0tLS06fDotLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLTp8CnwgUG9wdWxhdGlvbiAgfCBcJDI4LDMxNiB8ICAgICAgIDEwLDE4NCAgICAgICB8CgojIyBDZW50cmFsIExpbWl0IFRoZW9yZW0KCkJlbG93IGFyZSBoaXN0b2dyYW1zIHNob3dpbmcgdGhlIGRlbnNpdGllcyBvZiB0aGUgdmFyaW91cyBzYW1wbGUgbWVhbnMgb2YgMTAwMCByYW5kb20gc2FtcGxlcyBvZiBzYW1wbGUgc2l6ZXMgMTAsIDIwLCAzMCwgYW5kIDQwLiBUaGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgY2FuIGJlIHNlZW4gaW4gdGhlIHRhYmxlIGJlbG93LgoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aD1UUlVFfQoKZ3JpZC5hcnJhbmdlKGNsdF8xMCwgY2x0XzIwLCBjbHRfMzAsIGNsdF80MCwgbnJvdyA9IDIsIG5jb2wgPSAyKQoKYGBgCgp8IFNhbXBsZSBTaXplIHwgICBNZWFuICAgfCBTdGFuZGFyZCBEZXZpYXRpb24gfAp8Oi0tLS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS06fAp8IFBvcHVsYXRpb24gIHwgXCQyOCwzMTYgfCAgICAgICAxMCwxODQgICAgICAgfAp8ICAgICAxMCAgICAgIHwgXCQyOCwzNzcgfCAgICAgICAzLDE0MCAgICAgICAgfAp8ICAgICAyMCAgICAgIHwgXCQyOCwyNzAgfCAgICAgICAyLDEyMyAgICAgICAgfAp8ICAgICAzMCAgICAgIHwgXCQyOCwzMzMgfCAgICAgICAxLDYzMiAgICAgICAgfAp8ICAgICA0MCAgICAgIHwgXCQyOCwyOTMgfCAgICAgICAxLDM0MCAgICAgICAgfAoKIyMjICoqRmluZGluZ3MqKgoKLSAgIFRoZSBmb3VyIGhpc3RvZ3JhbXMgY29uZmlybSB0aGF0IHRoZSAqKkF2ZXJhZ2UgSW5jb21lIGF0dHJpYnV0ZSBhYmlkZXMgYnkgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSoqLgoKLSAgIEFsbCBmb3VyIG9mIHRoZSAqKnNhbXBsZSBtZWFuIGhpc3RvZ3JhbXMgYXJlIG5vcm1hbCBkaXN0cmlidXRpb25zIHdpdGggYSBtZWFuIG9mIFx+XCQyOCwwMDAqKi4gVGhpcyBtYXRjaGVzIHRoZSBtZWFuIGluY29tZSBvZiB0aGUgcG9wdWxhdGlvbi4KCi0gICBBcyBleHBlY3RlZCwgdGhlICoqc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgZGVuc2l0eSBoaXN0b2dyYW1zIGRlY3JlYXNlIGFzIHNhbXBsZSBzaXplIGluY3JlYXNlcy4qKiBUaGlzIGlzIHNlZW4gdmlzdWFsbHksIGFzIHRoZSBncmFwaHMgZ2V0IHByb2dyZXNzaXZlbHkgbmFycm93ZXIgYW5kIHRhbGxlciBmcm9tIHNhbXBsZSBzaXplIDEwIHRvIHNhbXBsZSBzaXplIDQwLiBFYWNoIGRpc3RyaWJ1dGlvbiBpcyBub3JtYWxseSBjZW50ZXJlZCBhcm91bmQgdGhlIHNhbWUgbWVhbi4KCiMjIFNhbXBsaW5nIG9mIEF2ZXJhZ2UgSW5jb21lCgpUaHJlZSBzYW1wbGluZyBtZXRob2RzIHdlcmUgdXNlZCB0byBhbmFseXplIHRoZSBiZWhhdmlvciBvZiBzYW1wbGluZyB0aGUgZmlyc3QtZ2VuZXJhdGlvbiBkYXRhc2V0LgoKMS4gICoqU2FtcGxlIFJhbmRvbSBTYW1wbGluZyoqIHdpdGhvdXQgUmVwbGFjZW1lbnQKMi4gICoqU3lzdGVtaWMgU2FtcGxpbmcqKiB3aXRoIFVuZXF1YWwgUHJvYmFiaWxpdGllcwogICAgLSAgICoqVW5lcXVhbCBwcm9iYWJpbGl0aWVzIHdlcmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgcG9wdWxhdGlvbiBvZiB0aGUgaW1taWdyYW50IGNvdW50cnkqKgozLiAgKipTdHJhdGlmaWVkIFNhbXBsaW5nKioKICAgIC0gICAqKlN0cmF0YSBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VudHJ5IGNvdW50IGZvciBlYWNoIG9mIDcgZ2xvYmFsIHN1YiByZWdpb25zKiogKEFmcmljYW4sIEFzaWEsIEV1cm9wZSwgTGF0aW4gQW1lcmljYSwgTWlkZGxlIEVhc3QswqBOb3J0aCBBbWVyaWNhLCBhbmQgT2NlYW5pYSkuCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CgpncmlkLmFycmFuZ2UocG9wX2hpc3QsIHNyc3dvcl9oaXN0LCBzeXNfaGlzdCwgc3RyYXRhX2hpc3QsIG5yb3cgPSAyLCBuY29sID0gMikKCmBgYAoKfCAgIFNhbXBsZSBNZXRob2QgICAgfCAgIE1lYW4gICB8IFN0YW5kYXJkIERldmlhdGlvbiB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS06fAp8ICAgICBQb3B1bGF0aW9uICAgICB8IFwkMjgsMzE2IHwgICAgICAgMTAsMTg0ICAgICAgIHwKfCAgICAgICBTUlNXT1IgICAgICAgfCBcJDI4LDEwNiB8ICAgICAgIDksOTM0ICAgICAgICB8CnwgVW5lcXVhbCBTeXN0ZW1hdGljIHwgXCQyNSwxOTkgfCAgICAgICA4LDc1OSAgICAgICAgfAp8ICAgICBTdHJhdGlmaWVkICAgICB8IFwkMjYsMzE4IHwgICAgICAgOCwxNTUgICAgICAgIHwKCiMjIyAqKkZpbmRpbmdzKioKCi0gICAqKlNSU1dPUioqOiBhcyBleHBlY3RlZCwgb2JzZXJ2ZWQgYm90aCBhIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBleHRyZW1lbHkgY2xvc2UgdG8gdGhhdCBvZiB0aGUgcG9wdWxhdGlvbi4KCi0gICAqKlVuZXF1YWwgU3lzdGVtYXRpYyBhbmQgU3RyYXRpZmllZDoqKiBib3RoIG9ic2VydmVkIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGxlc3MgdGhhbiB0aGF0IG9mIHRoZSBwb3B1bGF0aW9uLgoKLSAgIFRoZSBcfioqMTAlIGRlY3JlYXNlIGluIG1lYW4gYXZlcmFnZSBpbmNvbWUqKiBhbmQgXH4qKjE1JSBkZWNyZWFzZSBpbiBzdGFuZGFyZCBkZXZpYXRpb24qKiBvYnNlcnZlZCB3aGVuIHNhbXBsaW5nIHVzaW5nIHVuZXF1YWwgc3lzdGVtYXRpYyBhbmQgc3RyYXRpZmllZCBtZXRob2RzIGNhbiBiZSBleHBsYWluZWQgYnkgbG9va2luZyBhdCB0aGUgTGF0aW4gQW1lcmljYW4gc3Vic2V0IG9mIHRoZSBmaXJzdC1nZW5lcmF0aW9uIHBvcHVsYXRpb24uCgogICAgLSAgIElmIHdlIGxvb2sgYXQgdGhlIHBpZSBjaGFydCBpbiB0aGUgKkltbWlncmF0aW9uKiBzZWN0aW9uLCB3ZSBjYW4gc2VlIHRoYXQgdGhlICoqTGF0aW4gQW1lcmljYSBjb2hvcnQgaXMgcmVzcG9uc2libGUgZm9yIDUwJSoqIG9mIGFsbCBpbW1pZ3JhdGlvbiBpbnRvIHRoZSBVbml0ZWQgU3RhdGVzLgoKICAgIC0gICBJZiB3ZSBsb29rIGF0IHRoZSBib3ggcGxvdCBpbiB0aGUgKkluY29tZSogc2VjdGlvbiB3ZSBjYW4gc2VlIHRoYXQgdGhlICoqTGF0aW4gQW1lcmljYSByZWdpb24gaGFzIHRoZSBsb3dlc3QgYXZlcmFnZSBpbmNvbWUqKiAqKmFuZCBsb3dlc3QgdmFyaWFuY2UqKiBhbW9uZyBhbGwgNyByZWdpb25zLgoKICAgIC0gICBXaGVuIHdlIHNhbXBsZSB1c2luZyB1bmVxdWFsIHN5c3RlbWF0aWMgYW5kIHN0cmF0aWZpZWQgbWV0aG9kcyB3ZSBhcmUgKiptb3JlIGxpa2VseSB0byBkcmF3IGNvdW50cmllcyBmcm9tIHRoZSBMYXRpbiBBbWVyaWNhIHN0cmF0YSoqICoqYmVjYXVzZSBvZiB0aGUgcmVnaW9ucyBsYXJnZSBwb3B1bGF0aW9uKiogYW5kIGJlY2F1c2UgdGhlIExhdGluIEFtZXJpY2EgcmVnaW9uIGhhcyB0aGUgbW9zdCBmaXJzdC1nZW5lcmF0aW9uIGNvdW50cmllcy4gVGhlIExhdGluIEFtZXJpY2FuIHJlZ2lvbiBoYXMgdGhlIGxvd2VzdCBhdmVyYWdlIGluY29tZSBhbmQgbGVhc3QgdmFyaWFuY2UsIHdoaWNoIHJlc3VsdHMgaW4gYSByZWxhdGl2ZSAqKmRlY3JlYXNlIGluIGJvdGggdGhlIG1lYW4gaW5jb21lIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24qKiBjb21wYXJlZCB0byB0aGUgcG9wdWxhdGlvbi4KCi0gICBJIHRoaW5rIHRoYXQgdGhlICoqdW5lcXVhbCBzeXN0ZW1hdGljIHNhbXBsZSBtZXRob2QgaXMgdGhlIG1vc3QgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpcnN0LWdlbmVyYXRpb24gcG9wdWxhdGlvbidzIGF2ZXJhZ2UgaW5jb21lKiogYmVjYXVzZSBpdCBhZGRzIGEgY291bnRyeSBwb3B1bGF0aW9uIGRpbWVuc2lvbiB0byBhdmVyYWdlIGluY29tZSB0aGF0IHRoZSBvdGhlciBmb3VyIG1ldGhvZHMgZG8gbm90LiBJbiBvdGhlciB3b3Jkcywgd2hlbiB1c2luZyBzeXN0ZW1hdGljIHNhbXBsaW5nIHdpdGggdW5lcXVhbCBwcm9iYWJpbGl0aWVzLCBjb3VudHJpZXMgd2l0aCBsYXJnZXIgaW1taWdyYW50IHBvcHVsYXRpb25zIGNvbnRyaWJ1dGUgbW9yZSB0byB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGluY29tZS4gVGhpcyByZXN1bHRzIGluIGEgbWVhbiBpbmNvbWUgdmFsdWUgdGhhdCBpcyBtb3JlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBpbW1pZ3JhbnQgcG9wdWxhdGlvbi4KCiAgICAtICAgVG8gdXNlIGFuIGFuYWxvZ3ksIHRoZSBwb3B1bGF0aW9uIG1lYW4gaW5jb21lIGlzIHRvIHRoZSBTZW5hdGUsIGFzIHRoZSB1bmVxdWFsIHN5c3RlbWF0aWMgc2FtcGxpbmcgbWVhbiBpbmNvbWUgaXMgdG8gdGhlIEhvdXNlIG9mIFJlcHJlc2VudGF0aXZlcy4KCiMgIHsudW5udW1iZXJlZH0KCjxicj4KCiMgQXR0cmlidXRlIENvcnJlbGF0aW9uIHsudGFic2V0fQoKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBiZWxvdyBzaG93cyBhIGxvdCBvZiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYXR0cmlidXRlcyBleHBsb3JlZCBhYm92ZS4gVGhlIHRhYmJlZCBwbG90cyBkaXNwbGF5IHRoZXNlIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzLgoKIyMgQ29ycmVsYXRpb24gTWF0cml4CgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpjb3JycGxvdChjb3JfbWF0cml4ICwgdHlwZSA9ICJ1cHBlciIsIG9yZGVyID0gImhjbHVzdCIsIAogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSwgY29sPXZpcmlkaXMoMjUpWzE6MjBdKQoKYGBgCgojIyBDaGlsZHJlbiB2cy4gQXZlcmFnZSBFYXJuaW5ncwoKU3Ryb25nIE5lZ2F0aXZlIENvcnJlbGF0aW9uCgpgYGB7ciBmaWcud2lkdGg9OS41LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KY2hpbGRyZW5faW5jb21lCmBgYAoKIyMgRWR1Y2F0aW9uIHZzLiBBdmVyYWdlIEVhcm5pbmdzCgpTdHJvbmcgUG9zaXRpdmUgQ29ycmVsYXRpb24KCmBgYHtyIGZpZy53aWR0aD05LjUsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aD1UUlVFfQplZHVfaW5jb21lCmBgYAoKIyMgQ2l0aXplbnNoaXAgdnMuIEF2ZXJhZ2UgRWFybmluZ3MKCk5vIENvcnJlbGF0aW9uCgpgYGB7ciBmaWcud2lkdGg9OS41LCBmaWcuaGVpZ2h0PTYsIGZpZy5mdWxsd2lkdGg9VFJVRX0KY2l0aXplbl9pbmNvbWUKYGBgCgojIyBFZHVjYXRpb24gdnMuIENpdGl6ZW5zaGlwCgpNb2RlcmF0ZSBQb3NpdGl2ZSBDb3JyZWxhdGlvbgoKYGBge3IgZmlnLndpZHRoPTkuNSwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoPVRSVUV9CmNpdGl6ZW5fZWR1CmBgYAoKPGJyPiBcIyB7LnVubnVtYmVyZWR9CgojIEZ1dHVyZSBJbnZlc3RpZ2F0aW9uCgotICAgSSB3YW50IHRvIGV4cGxvcmUgc2Vjb25kLWdlbmVyYXRpb24gQW1lcmljYW4gZGF0YSB0byBsb29rIGF0IHRoZSBjaGFuZ2UgaW4gZWR1Y2F0aW9uIHJhdGVzLCBhbmQgaW5jb21lLiBBbmQgbG9vayBpbnRvIGhvdyB0aG9zZSBjaGFuZ2VzIGltcGFjdCBudW1iZXIgb2YgY2hpbGRyZW4gYmVjYXVzZSBhcyB3ZSBvYnNlcnZlZCwgdGhlcmUgd2FzIGEgc3Ryb25nIGNvcnJlbGF0aW9uIGJldHdlZW4gaW5jb21lIGFuZCBudW1iZXIgb2YgY2hpbGRyZW4uCi0gICBFdXJvcGVhbnMgaGF2ZSB0aGUgaGlnaGVzdCBhdmVyYWdlIGluY29tZSwgYnV0IGFyZSBub3QgdGhlIGhpZ2hlc3QgZWR1Y2F0ZWQgcmVnaW9uYWwgY29ob3J0LiBJIHdhbnQgdG8gZXhwbG9yZSB0aGUgcm9sbCBvZiBsYW5ndWFnZSBvbiBpbmNvbWUuCgojIFJlZmVyZW5jZXMKCjxodHRwczovL2RhdGEuY2Vuc3VzLmdvdi9tZGF0LyMvPgo=